#ifndef SC_FILE_PUSHER_H
#define SC_FILE_PUSHER_H

#include "common.h"

#include <stdbool.h>

#include "util/intr.h"
#include "util/thread.h"
#include "util/vecdeque.h"

/* 自定义的文件推送动作 */
enum sc_file_pusher_action {
    /* 安装APK */
    SC_FILE_PUSHER_ACTION_INSTALL_APK,

    /* 推送普通文件,可以直接将电脑中的文件拖放到scrcpy中，实现手机与电脑文件的传输 */
    SC_FILE_PUSHER_ACTION_PUSH_FILE,
};

/* 自定义的文件推送请求 */
struct sc_file_pusher_request {
    enum sc_file_pusher_action action;
    char *file;
};

/* 文件推送的请求队列 */
struct sc_file_pusher_request_queue SC_VECDEQUE(struct sc_file_pusher_request);

/* 自定义的文件推送器 */
struct sc_file_pusher {

    // android设备序列号
    char *serial;

    // 文件上传到android设备的目标路径
    const char *push_target;

    sc_thread thread;
    sc_mutex mutex;
    sc_cond event_cond;
    bool stopped;
    bool initialized;

    // 文件上传队列
    struct sc_file_pusher_request_queue queue;

    struct sc_intr intr;
};

/* 
初始化文件推送器 
@param fp 文件推送相关的信息，上下文信息
@param serial 设备序列号，不能为空
@param push_target 文件上传到设备的目标路径，传空则使用默认值
@return 初始化成功返回true，否则返回false
*/
bool
sc_file_pusher_init(struct sc_file_pusher *fp, const char *serial,
                    const char *push_target);

/* 
清理文件推送器（回收资源） file_pusher_request  
@param fp 文件推送工具，上下文信息
*/
void
sc_file_pusher_destroy(struct sc_file_pusher *fp);

/*
异步开启一个文件上传的任务，一直等待文件的上传。有文件上传任务时直接开启
@param fp 文件推送的上下文
@return 异步线程开启成功返回true,否则返回false
*/
bool
sc_file_pusher_start(struct sc_file_pusher *fp);

/*
停止文件上传至设备的线程，函数返回时线程并一定已经结束了
@param fp 文件推送的上下文
*/
void
sc_file_pusher_stop(struct sc_file_pusher *fp);

/*
等待文件上传完成
@param fp 文件推送的上下文
*/
void
sc_file_pusher_join(struct sc_file_pusher *fp);

// take ownership of file, and will free() it
/*
创建一个文件推送的请求
@param fp 文件推送的上下文
@param action 上传文件还是安装文件
@param file 文件的上传路径
@return 创建成功返回true,否则返回false
*/
bool
sc_file_pusher_request(struct sc_file_pusher *fp,
                       enum sc_file_pusher_action action, char *file);

#endif
